/*
 * Copyright 2020-2030 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitee.minimalismstyle.fresh.common.data.beetl.ami

import com.gitee.minimalismstyle.fresh.common.core.domain.QueryParams
import com.gitee.minimalismstyle.fresh.common.core.domain.Simple
import com.gitee.minimalismstyle.fresh.common.core.exception.MessageException
import com.gitee.minimalismstyle.fresh.common.data.beetl.extra.toPageRequest
import com.gitee.minimalismstyle.fresh.common.data.beetl.extra.toQueryBody
import org.beetl.sql.core.SQLManager
import org.beetl.sql.core.SqlId
import org.beetl.sql.core.page.PageRequest
import org.beetl.sql.mapper.MapperInvoke
import org.springframework.util.StringUtils
import java.lang.reflect.Method

/**
 * 统一查询对象查询 beetl Ami
 * @author maoxiaodong
 */
class FindByQueryParamsAmi : MapperInvoke() {

    @Suppress("UNCHECKED_CAST")
    override fun call(sm: SQLManager, entityClass: Class<Any>, m: Method?, args: Array<out Any>): Any {
        if(args.isNotEmpty() && args[0] is QueryParams<*>){
            val queryParams = args[0] as QueryParams<Any>
            var namespace = StringUtils.uncapitalize(entityClass.simpleName);
            val sqlId = SqlId.of(namespace, "findByQueryParams")
            val pageRequest: PageRequest<Any> = queryParams.toPageRequest()

            val pageResult = sm.pageQuery(sqlId, Map::class.java, queryParams.params, pageRequest)
            return pageResult.toQueryBody()
        }else{
            throw MessageException(message = "请传正确的参数")
        }

    }
}